//David Hsieh #08225
//Hoja de Trabajo #1

/**
 *
 * @author David Hsieh
 */
public class Parqueo {


//Arreglo de Espacios
    private InterfazEspacio<Carro>[] espacios;

//    Metodo Constructor del parqueo
    /**
     *
     */
    public Parqueo() {
        espacios = new EspacioArrays[3];
        int x = 0;
        while( x < espacios.length) {
            espacios[x] = new EspacioArrays(10);
            x++;
        }
    }

//    Metodo para ingresar un carro
    /**
     *
     * @param carro
     */
    public void ingresarCarro(Carro carro) {
        int x = 0;
        while(espacios[x].lleno()) {
            x++;
            if(x >= espacios.length) {
                System.out.println("No hay espacio en el parqueo");
                break;
            }
        }

        if(x < espacios.length) {
            espacios[x].agregar(carro);
            System.out.println("El vehiculo con placa " + carro.getPlaca() + " fue ingresado con exito!");
        }

        //Assert que verifica que el último carro del espacio sea el mismo que se ingresó
        
        assert !espacios[x].vacio(): "El espacio sigue vacío";

    }

//    Metodo para retirar un carro del espacio
    /**
     *
     * @param placa
     * @param id
     * @throws Exception
     */
    public void retirarCarro(String placa, int id) throws Exception {

        EspacioArrays<Carro> calle = new EspacioArrays(10);

        try {

            if(id < 1 || id >3)
                throw new OptionException("OpcionIncorrecta");
                           }
        catch(OptionException e) {
            System.out.println("ERROR: Opcion Incorrecta. No existe espacio " + id);
        }

        try {
            if(espacios[id-1].verUltimo() == null)
                throw new EmptyException("No hay carros en el espacio");

            while(!espacios[id-1].verUltimo().getPlaca().equals(placa))
            {
               
                calle.agregar(espacios[id-1].retirar());
                System.out.println(calle.verUltimo().getPlaca() + "salio temporalmente a la calle");
                if(espacios[id-1].verUltimo()==null)
                    break;
            }
        } catch(EmptyException e) {
            System.out.println("ERROR: El espacio " + id +" se encuentra vacio");
        }


        if(!espacios[id-1].vacio()) {
            espacios[id-1].retirar();
            System.out.println("El vehiculo con placa " + placa + " fue retirado con exito");
        }
        else
            System.out.println("El vehículo no se encuentra en este espacio, se le cobrará una multa");
        while(!calle.vacio()) {
            espacios[id-1].agregar(calle.retirar());
            System.out.println(espacios[id-1].verUltimo().getPlaca() + " reingresado");
        }

        //Assert que verifica que el último carro del espacio no sea igual al que se retiró
        assert !placa.equals(espacios[id-1].verUltimo().getPlaca()): "El carro no fue removido correctamente, porque sigue estando ahí" ;

    }
    
//Metodo que despliega el estado del parqueo
    /**
     *
     */
    public void verEstado() {

        InterfazEspacio<Carro> espacioTemp;
        System.out.println();
        for(int i = 0; i < espacios.length; i++) {
            System.out.println();
            //System.out.println("-------------------------------");
            System.out.println("____________________________________________________________________________________________________________________________");
            System.out.println("Espacio " + (i+1) + " |");
            System.out.println("-----------");
            espacioTemp = new EspacioArrays(10);
            while(!espacios[i].vacio())
                espacioTemp.agregar(espacios[i].retirar());
            while(!espacioTemp.vacio()) {
                espacios[i].agregar(espacioTemp.retirar());
                System.out.print(espacios[i].verUltimo().getPlaca() + "\t");
            }
            System.out.println();
            System.out.println("____________________________________________________________________________________________________________________________");
        }


    }



}
